package com.amapv2.apis.overlay;

import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.graphics.Point;
import android.os.Bundle;
import android.os.Handler;
import android.os.SystemClock;
import android.text.SpannableString;
import android.text.style.ForegroundColorSpan;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.animation.BounceInterpolator;
import android.view.animation.Interpolator;
import android.widget.ImageView;
import android.widget.RadioGroup;
import android.widget.TextView;
import android.widget.Toast;

import com.amap.api.maps.AMap.InfoWindowAdapter;
import com.amap.api.maps.AMap.OnInfoWindowClickListener;
import com.amap.api.maps.AMap.OnMapLoadedListener;
import com.amap.api.maps.AMap.OnMarkerClickListener;
import com.amap.api.maps.AMap.OnMarkerDragListener;
import com.amap.api.maps.CameraUpdateFactory;
import com.amap.api.maps.Projection;
import com.amap.api.maps.model.BitmapDescriptor;
import com.amap.api.maps.model.BitmapDescriptorFactory;
import com.amap.api.maps.model.LatLng;
import com.amap.api.maps.model.LatLngBounds;
import com.amap.api.maps.model.Marker;
import com.amap.api.maps.model.MarkerOptions;
import com.amapv2.apis.R;
import com.amapv2.apis.basic.BaseMapActivvity;
import com.amapv2.apis.util.Constants;

import java.util.ArrayList;

/**
 * AMapV2地图中简单介绍一些Marker的用法.
 */
public class MarkerActivity extends BaseMapActivvity implements
        OnClickListener {
    private MarkerOptions markerOption;
    private TextView mMarkerText;//拖动位置
    private RadioGroup radioOption;
    private Marker marker2;// 有跳动效果的marker对象
    private LatLng LANZHOU = new LatLng(36.061, 103.834);//兰州的坐标


    @Override
    protected void initView(Bundle savedInstanceState) {
        super.initView(savedInstanceState);
        initSettingView();
    }

    /**
     * 将设置的View添加到容器中
     */
    private void initSettingView() {
        View view = getLayoutInflater().inflate(R.layout.marker_activity_setting, mFlContainer, false);
        mFlContainer.addView(view);
        mMarkerText = (TextView) view.findViewById(R.id.marker_text);
        view.findViewById(R.id.clearMap).setOnClickListener(this);
        view.findViewById(R.id.resetMap).setOnClickListener(this);
        radioOption = (RadioGroup) view.findViewById(R.id.custom_info_window_options);
    }

    @Override
    protected void initMap() {
        super.initMap();
        initMapListener();
    }

    @Override
    protected void initData() {
        super.initData();
        addMarkersToMap();// 往地图上添加marker
    }

    private void initMapListener() {
        aMap.setOnMapLoadedListener(mOnMapLoadedListener);// 设置amap加载成功事件监听器
        aMap.setOnMarkerClickListener(mOnMarkerClickListener);// 设置点击marker事件监听器
        aMap.setOnInfoWindowClickListener(mOnInfoWindowClickListener);// 设置点击infoWindow事件监听器
        aMap.setInfoWindowAdapter(mInfoWindowAdapter);// 设置自定义InfoWindow样式
    }

    /**
     * 地图加载完成的回调
     */
    OnMapLoadedListener mOnMapLoadedListener = new OnMapLoadedListener() {
        /**
         * 监听amap地图加载成功事件回调
         */
        @Override
        public void onMapLoaded() {
            // 设置所有maker显示在当前可视区域地图中
            //1、定义了经纬度的一个范围
            //包括西安，包括成都，包括一个自定义的经纬度
            LatLngBounds bounds = new LatLngBounds
                    .Builder()
                    .include(Constants.XIAN)
                    .include(Constants.CHENGDU)
                    .include(LANZHOU)
                    .build();

            //2、移动到这个范围中
            aMap.moveCamera(CameraUpdateFactory.newLatLngBounds(bounds, 150));
        }
    };

    /**
     * 点击标记点执行的事件
     */
    OnMarkerClickListener mOnMarkerClickListener = new OnMarkerClickListener() {
        /**
         * 对marker标注点点击响应事件
         */
        @Override
        public boolean onMarkerClick(final Marker marker) {
            //1、如果是西安这个点，那么就跳动的效果
            if (marker.equals(marker2)) {
                if (aMap != null) {
                    jumpPoint(marker);
                }
            }
            mMarkerText.setText("你点击的是" + marker.getTitle());
            return false;
        }
    };

    /**
     * 点击InfoWindo的时候执行的方法
     */
    OnInfoWindowClickListener mOnInfoWindowClickListener = new OnInfoWindowClickListener() {
        /**
         * 监听点击infowindow窗口事件回调
         */
        @Override
        public void onInfoWindowClick(Marker marker) {
            Toast.makeText(mContext, ""+marker.getTitle()+"--"+aMap.getMapScreenMarkers().size(),
                    Toast.LENGTH_SHORT).show();
        }
    };

    /**
     * 用来定制marker的信息窗口
     * 1、默认情况下，当单击某个marker时，如果该marker的Title和Snippet不为空，则会触发getInfoWindow和getInfoContents回调。
     * 2、另外，通过调用Marker.showInfoWindow()同样可以触发上面两个回调。
     * 3、自5.2.1开始，如果AMap.InfoWindowAdapter.getInfoWindow(Marker) 和 AMap.InfoWindowAdapter.getInfoContents(Marker)
     * 均返回null，将不展示InfoWindow的信息
     */
    InfoWindowAdapter mInfoWindowAdapter = new InfoWindowAdapter() {
        /**
         * 监听自定义infowindow窗口的infocontents事件回调
         */
        @Override
        public View getInfoContents(Marker marker) {
            if (radioOption.getCheckedRadioButtonId() != R.id.custom_info_contents) {
                return null;
            }
            View infoContent = getLayoutInflater().inflate(R.layout.custom_info_contents, null);
            //给View设置数据
            render(marker, infoContent);
            //返回InfoContent
            return infoContent;
        }

        /**
         * 监听自定义infowindow窗口的infowindow事件回调
         */
        @Override
        public View getInfoWindow(Marker marker) {
            if (radioOption.getCheckedRadioButtonId() != R.id.custom_info_window) {
                return null;
            }
            //加载View
            View infoWindow = getLayoutInflater().inflate(R.layout.custom_info_window, null);
            //给View设置数据
            render(marker, infoWindow);
            //返回infoWindow
            return infoWindow;
        }

    };

    /**
     * 在地图上添加marker
     */
    private void addMarkersToMap() {
        addChendDuMarker();
        addXiAnMarker();
        drawLanZhouMarker();
    }

    /**
     * 添加成都的标记点
     */
    private void addChendDuMarker() {
        //注意：
        //1、颜色渐变
        //逻辑
        //1、生成成都这个点的颜色渐变的集合：黄红蓝
        ArrayList<BitmapDescriptor> giflist = new ArrayList<BitmapDescriptor>();
        giflist.add(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_BLUE));
        giflist.add(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_RED));
        giflist.add(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_YELLOW));

        //2、构造market点的参数
        //在高德API的这个模块：开发 > Android 地图SDK > 开发指南 > 在地图上绘制 > 绘制点标记上有完整的参数
        //anchor:点标记的锚点 position:在地图上标记位置的经纬度信息。title:点标记的标题
        //snippet:点标记的内容 icons:标记点 draggable:可否可以被拖拽
        MarkerOptions markerOptions = new MarkerOptions()
                .anchor(0.5f, 0.5f)
                .position(Constants.CHENGDU)
                .title("成都市")
                .snippet("成都市:30.679879, 104.064855")
                .icons(giflist)//显示的图标的集合
                .perspective(true)
                .draggable(true)
                .period(50);

        //3、添加标记点
        aMap.addMarker(markerOptions);
    }

    /**
     * 添加一个西安的点
     */
    private void addXiAnMarker() {
        //注意：
        //1、自定义图标
        //逻辑
        //1、构造西安的点的参数
        MarkerOptions optionXiAn = new MarkerOptions();
        optionXiAn.position(Constants.XIAN);
        optionXiAn.title("西安市").snippet("西安市：34.341568, 108.940174");
        optionXiAn.perspective(true);
        optionXiAn.draggable(true);
        //markerOption.icon(BitmapDescriptorFactory.fromResource(R.drawable.location_marker));
        optionXiAn.icon(BitmapDescriptorFactory.fromBitmap
                (BitmapFactory.decodeResource(getResources(), R.drawable.location_marker)));
        //将Marker设置为贴地显示，可以双指下拉看效果
        optionXiAn.setFlat(true);

        //2、给地图添加先的点
        marker2 = aMap.addMarker(optionXiAn);
    }

    /**
     * 绘制兰州的点
     */
    public void drawLanZhouMarker() {
        //注意：
        //旋转角度
        //逻辑：
        //1、设置绘制点的参数
        MarkerOptions optionLanZhou = new MarkerOptions()
                .position(LANZHOU)
                .title("好好学习")
                .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_AZURE))
                .perspective(true)
                .draggable(true);
        //2、添加点
        Marker marker = aMap.addMarker(optionLanZhou);
        //3、设置点的参数
        marker.setRotateAngle(90);// 设置marker旋转90度
        marker.showInfoWindow();// 设置默认显示一个infowinfow
    }

    /**
     * marker点击时跳动一下
     */
    public void jumpPoint(final Marker marker) {
        //1、
        final Handler handler = new Handler();
        final long start = SystemClock.uptimeMillis();
        Log.e(TAG,"start:"+start);
        //返回一个从地理位置转换回来的屏幕位置（地图 --> 屏幕）
        Projection proj = aMap.getProjection();
        Point startPoint = proj.toScreenLocation(Constants.XIAN);
        startPoint.offset(0, -300);
        //根据屏幕位置得到一个地图位置（屏幕 --> 地图）
        final LatLng startLatLng = proj.fromScreenLocation(startPoint);
        final long duration = 1500;

        //动画结束的时候弹起的这样的一个插值器
        final Interpolator interpolator = new BounceInterpolator();
        handler.post(new Runnable() {
            @Override
            public void run() {
                long elapsed = SystemClock.uptimeMillis() - start;
                Log.e(TAG,"elapsed:"+elapsed);
                //1、求的初始的经纬度
                //当前动画用的时间/总的动画时间对应的一个属性值，由于它是动画结束的时候的一个插值器
                //可以想想一下这个画面，从底部落下来一个小球，想想一个图
                // 所以它的这个值会减小的越来越快，然后增长的越来越慢，然后减小的越来越快
                float t = interpolator.getInterpolation((float) elapsed / duration);
                Log.e(TAG+"t","t:"+t);
                double lat = startLatLng.latitude + t * (Constants.XIAN.latitude - startLatLng.latitude);//维度
                double lng = t * Constants.XIAN.longitude + (1 - t) * startLatLng.longitude;//经度
                Log.e(TAG,"lat:"+lat+"lng:"+lng);
                //设置位置
                marker.setPosition(new LatLng(lat, lng));
                if (t < 1.0) {
                    Log.e(TAG,"do it");
                    handler.postDelayed(this, 16);
                }
            }
        });
    }

    /**
     * 自定义infowinfow窗口
     */
    public void render(Marker marker, View view) {
        //1、找到View的空间
        ImageView imageView = (ImageView) view.findViewById(R.id.badge);
        TextView titleUi = ((TextView) view.findViewById(R.id.title));//标题
        TextView snippetUi = ((TextView) view.findViewById(R.id.snippet));//内容

        //2、然后从market中取出数据
        String title = marker.getTitle();
        String snippet = marker.getSnippet();

        //3、给View中的控件设置数据
        //3.1给图标设置数据
        if (radioOption.getCheckedRadioButtonId() == R.id.custom_info_contents) {
            imageView.setImageResource(R.drawable.badge_sa);
        } else if (radioOption.getCheckedRadioButtonId() == R.id.custom_info_window) {
            imageView.setImageResource(R.drawable.badge_wa);
        }

        //3.2给标题设置数据
        if (title != null) {
            SpannableString titleText = new SpannableString(title);
            titleText.setSpan(new ForegroundColorSpan(Color.RED), 0,
                    titleText.length(), 0);
            titleUi.setTextSize(15);
            titleUi.setText(titleText);
        } else {
            titleUi.setText("");
        }

        //3、给内容设置数据
        if (snippet != null) {
            SpannableString snippetText = new SpannableString(snippet);
            snippetText.setSpan(new ForegroundColorSpan(Color.GREEN), 0,
                    snippetText.length(), 0);
            snippetUi.setTextSize(20);
            snippetUi.setText(snippetText);
        } else {
            snippetUi.setText("");
        }
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.clearMap://清空地图上所有已经标注的marker
                if (aMap != null) {
                    aMap.clear();
                }
                break;
            case R.id.resetMap://重新标注所有的marker
                if (aMap != null) {
                    aMap.clear();
                    addMarkersToMap();
                }
                break;
            default:
                break;
        }
    }
}
